package com.fly.controller;

import com.fly.bean.*;
import com.fly.service.CircuitryServiceO;
import com.fly.service.PoleServiceO;
import com.fly.service.SysProValueServiceO;
import com.fly.util.JWTUtil;
import com.fly.util.Msg;
import com.fly.util.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List;

/**
 * @Auther: Orchid
 * @Date: 2019/11/28 16:04
 * @Description:
 */
@Controller
@RequestMapping("/circuitryOrchid")
public class CircuitryControllerO {

    @Autowired
    CircuitryServiceO circuitryServiceO;

    @Autowired
    SysProValueServiceO sysProValueServiceO;

    @Autowired
    PoleServiceO poleServiceO;

    /**
     * 查询所有线路
     * 做选择线路数据填充
     * @return
     */
    @RequestMapping("/getAllCircuitry")
    @ResponseBody
    public Msg getAllCircuitry() {

        //查询所有线路信息
        List<Circuitry> circuitryList = circuitryServiceO.queryAllCir();

        return Msg.success().add("circuitries", circuitryList);
    }

    /**
     * 分页显示线路信息
     * @param page 分页实体信息
     * @return 结果集合
     */
    @RequestMapping(value = "/getCirByPage")
    @ResponseBody
    public Msg getCirByPage(@RequestBody Page page){

        //分页查询数据
        List<Circuitry> circuitryList = circuitryServiceO.queryCirByPage(page);

        //查询总数，或的总页数
        Integer count = circuitryServiceO.queryCirAllCount();

        Msg msg = Msg.success();
        msg.add("circuitries", circuitryList);
        msg.add("count", count);

        return msg;
    }


    /**
     * 修改线路状态
     * @param circuitryState 线路状态
     * @param circuitryId 线路id
     * @return
     */
    @RequestMapping("/updateCircuitryState")
    @ResponseBody
    public Msg updateCircuitryState(@RequestParam("circuitryState") String circuitryState, @RequestParam("circuitryId") Integer circuitryId){

        //设置查询实体信息
        SystemPropertiesValue systemPropertiesValue = new SystemPropertiesValue();
        //
        //        //设置系统值的name
        systemPropertiesValue.setSysProValueName(circuitryState);

        //设置线路信息
        Circuitry circuitry = new Circuitry();
        circuitry.setCircuitryId(circuitryId);
        circuitry.setSystemPropertiesValue(systemPropertiesValue);

//        如果存在，就不能停用。
        if ("停用".equals(circuitryState)){

            //获得该线路下的启用杆塔的数量
            Integer poleCount = circuitryServiceO.queryCirByPoleActiveCount(circuitryId);

            if (poleCount > 0){

                return Msg.fail().add("error", "该线路有杆塔在启用，无法停用。");

            }

        }

        //如果停用时没有杆塔在启用，就停用
        //修改状态
        Integer isUp = circuitryServiceO.updateStateById(circuitry);

        if (isUp > 0){
            return Msg.success();
        }else {
            return Msg.fail().add("error", "修改失败");
        }

    }

    /**
     * 根据线路id查线路所有信息
     * @param circuitryId 线路id
     * @return 线路实体
     */
    @RequestMapping("/getCircuitryById")
    @ResponseBody
    public Msg getCircuitryById(Integer circuitryId){

        //根据id查询线路信息
        Circuitry circuitry = circuitryServiceO.queryCirById(circuitryId);

        if (circuitry != null){
            return Msg.success().add("circuitry", circuitry);
        }else {
            return Msg.fail().add("error", "查询失败");
        }

    }

    /**
     * 修改线路信息
     * @return 成功条数
     */
    @RequestMapping("/updateCircuitryById")
    @ResponseBody
    public Msg updateCircuitryById(Circuitry circuitry, String startPoleNo, String endPoleNo , String sysProValueName){

        //测试数据
//        circuitry.setCircuitryId(1);
//        circuitry.setCircuitryNo("wx00011");
//        circuitry.setCircuitryName("西渭一线1");
//
        Pole pole = new Pole();
        pole.setPoleNo(startPoleNo);

//        pole.setPoleNo("XW000100001");

        circuitry.setStartPole(pole);
//
        Pole endPole = new Pole();
        endPole.setPoleNo(endPoleNo);

//        endPole.setPoleNo("XW000100002");

        circuitry.setEndPole(endPole);
//
//        circuitry.setLineLength(1001.0);
//        circuitry.setDeLiveryDate(new Date());
//
//        circuitry.setPoleNumber(10001);
//
//        circuitry.setRunningStatus("维修中");
//
        SystemPropertiesValue systemPropertiesValue = new SystemPropertiesValue();
        systemPropertiesValue.setSysProValueName(sysProValueName);
//        systemPropertiesValue.setSysProValueName("启用");
        circuitry.setSystemPropertiesValue(systemPropertiesValue);
//
//        circuitry.setLineLength(20001.0);
//
//        circuitry.setBackLineLength(30001.0);
//
//        circuitry.setDeLiveryDate(new Date());
//
//        circuitry.setVoltageLevelId(121.0);
//
//        circuitry.setCircuitryNote("test");


//        判断线路No是否存在
        Boolean isExitNo = circuitryServiceO.queryOtherNoCountByNo(circuitry);

        if (isExitNo){
            return Msg.fail().add("error", "添加失败，该线路编号已存在。");
        }

        //判断起始杆塔编号是否存在
        Boolean isExitStartPole = poleServiceO.queryPoleNoIsExit(circuitry.getStartPole());

        //如果不存在返回错误信息
        if (!isExitStartPole){
            return Msg.fail().add("error","起始杆塔编号不存在");
        }

        //判断起始杆塔是否是停用状态
        Boolean isDisable = poleServiceO.queryCountByPoleActiveDisable(circuitry.getStartPole().getPoleNo());

        if (isDisable){
            return Msg.fail().add("error", "该起始杆塔是停用状态，无法添加。");
        }

        //判断杆塔是否属于某条线路
        Pole startPoleCir = new Pole();
        startPoleCir.setPoleNo(circuitry.getStartPole().getPoleNo());
        startPoleCir.setCircuitry(circuitry);
        Boolean startPoleIsCir = poleServiceO.queryPoleIsCir(startPoleCir);

        if (startPoleIsCir){
            return Msg.fail().add("error", "添加错误，起始杆塔已经属于某条线路。");
        }

        //判断终止杆塔编号是否存在
        Boolean isExitEndPole = poleServiceO.queryPoleNoIsExit(circuitry.getEndPole());
        //如果终止杆塔编号不存在，返回错误信息
        if (!isExitEndPole){
            return Msg.fail().add("error", "终止杆塔编号不存在");
        }

        //判断起始杆塔是否是停用状态
        Boolean isEndDisable = poleServiceO.queryCountByPoleActiveDisable(circuitry.getStartPole().getPoleNo());

        if (isEndDisable){
            return Msg.fail().add("error", "该终止杆塔是停用状态，无法添加。");
        }

        Pole endPoleCir = new Pole();
        endPoleCir.setPoleNo(circuitry.getEndPole().getPoleNo());
        endPoleCir.setCircuitry(circuitry);
        Boolean endPoleIsCir = poleServiceO.queryPoleIsCir(endPoleCir);

        if (endPoleIsCir){
            return Msg.fail().add("error", "添加错误，终止杆塔已经属于某条线路。");
        }

        Boolean isUp = circuitryServiceO.updateCirById(circuitry);

        if (isUp){
            return Msg.success();
        }else {
            return Msg.fail().add("error", "修改失败");
        }

    }

    /**
     * 根据线路id删除线路信息
     * @param circuitryId 线路id
     * @return 结果条数
     */
    @RequestMapping("/deleteCircuitryById")
    @ResponseBody
    public Msg deleteCircuitryById(Integer circuitryId){

        //判断线路的任务是否含有未完成状态
        Boolean isTaskFinish = circuitryServiceO.queryCirTaskIsFinish(circuitryId);

        if (isTaskFinish){
            return Msg.fail().add("error", "线路的任务含有未完成状态。");
        }

        //获得该线路下的启用杆塔的数量
        Integer poleCount = circuitryServiceO.queryCirByPoleActiveCount(circuitryId);

        if (poleCount > 0){

            return Msg.fail().add("error", "该线路有杆塔在启用，无法删除。");

        }

        Boolean isDel = circuitryServiceO.deleteCircuitryById(circuitryId);

        if (isDel){
            return Msg.success();
        }else {
            return Msg.fail().add("error", "删除失败，或id不存在");
        }
    }

    /**
     * 添加信息的线路信息
     * @param circuitry 线路实体
     * @return
     */
    @RequestMapping("/addCircuitry")
    @ResponseBody
    public Msg addCircuitry(Circuitry circuitry, String startPoleNo, String endPoleNo , String sysProValueName, HttpServletRequest request){

        //测试数据
////        circuitry.setCircuitryId(1);
//        circuitry.setCircuitryNo("XW0018");
//        circuitry.setCircuitryName("西渭一线1");
//
        Pole pole = new Pole();
        pole.setPoleNo(startPoleNo);

//        pole.setPoleNo("XW000100001");

        circuitry.setStartPole(pole);
//
        Pole endPole = new Pole();
        endPole.setPoleNo(endPoleNo);

//        endPole.setPoleNo("XW000100002");
        circuitry.setEndPole(endPole);
//
//        circuitry.setLineLength(1001.0);
//        circuitry.setDeLiveryDate(new Date());
//
//        circuitry.setPoleNumber(10001);
//
//        circuitry.setRunningStatus("正常");

        SystemPropertiesValue systemPropertiesValue = new SystemPropertiesValue();
        systemPropertiesValue.setSysProValueName(sysProValueName);
//        systemPropertiesValue.setSysProValueName("启用");
        circuitry.setSystemPropertiesValue(systemPropertiesValue);

//        Users users = new Users();
//        users.setUserId(10000008);
//        circuitry.setUser(users);
//
//        circuitry.setLineLength(20001.0);
//
//        circuitry.setBackLineLength(30001.0);
//
//        circuitry.setDeLiveryDate(new Date());
//
//        circuitry.setVoltageLevelId(121.0);
//
//        circuitry.setCircuitryNote("test");

        //获取token中的用户数据
        String token = request.getHeader("Authorization");

        //获取登录用户的对象信息
        Users users = JWTUtil.unsign(token, Users.class);

        if (users == null){
            return Msg.fail().add("error", "请先登录。");
        }

        circuitry.setUser(users);

//        判断线路No是否存在
        Boolean isExitNo = circuitryServiceO.queryCountByNo(circuitry.getCircuitryNo());

        if (isExitNo){
            return Msg.fail().add("error", "添加失败，该线路编号已存在。");
        }

        //判断起始杆塔编号是否存在
        Boolean isExitStartPole = poleServiceO.queryPoleNoIsExit(circuitry.getStartPole());

        //如果不存在返回错误信息
        if (!isExitStartPole){
            return Msg.fail().add("error","起始杆塔编号不存在");
        }

        //判断起始杆塔是否是停用状态
        Boolean isDisable = poleServiceO.queryCountByPoleActiveDisable(circuitry.getStartPole().getPoleNo());

        if (isDisable){
            return Msg.fail().add("error", "该起始杆塔是停用状态，无法添加。");
        }

        //判断杆塔是否属于某条线路
        Pole startPoleCir = new Pole();
        startPoleCir.setPoleNo(circuitry.getStartPole().getPoleNo());
        startPoleCir.setCircuitry(circuitry);
        Boolean startPoleIsCir = poleServiceO.queryPoleIsCir(startPoleCir);

        if (startPoleIsCir){
            return Msg.fail().add("error", "添加错误，起始杆塔已经属于某条线路。");
        }

        //判断终止杆塔编号是否存在
        Boolean isExitEndPole = poleServiceO.queryPoleNoIsExit(circuitry.getEndPole());
        //如果终止杆塔编号不存在，返回错误信息
        if (!isExitEndPole){
            return Msg.fail().add("error", "终止杆塔编号不存在");
        }

        //判断起始杆塔是否是停用状态
        Boolean isEndDisable = poleServiceO.queryCountByPoleActiveDisable(circuitry.getStartPole().getPoleNo());

        if (isEndDisable){
            return Msg.fail().add("error", "该终止杆塔是停用状态，无法添加。");
        }

        Pole endPoleCir = new Pole();
        endPoleCir.setPoleNo(circuitry.getEndPole().getPoleNo());
        endPoleCir.setCircuitry(circuitry);
        Boolean endPoleIsCir = poleServiceO.queryPoleIsCir(endPoleCir);

        if (endPoleIsCir){
            return Msg.fail().add("error", "添加错误，终止杆塔已经属于某条线路。");
        }

        //添加线路信息
        Boolean isAdd = circuitryServiceO.addCircuitry(circuitry);

        if (isAdd){
            return Msg.success();
        }else {
            return Msg.fail().add("error", "添加失败");
        }

    }


    /**
     * 根据线路no和运行状态模糊查询线路信息
     * @param circuitry 线路查询信息
     * @param page 分页信息实体
     * @return
     */
    @RequestMapping("/getCirPageByNo")
    @ResponseBody
    public Msg getCirPageByNo(Circuitry circuitry, Page page ){

        //查询数据
        List<Circuitry> circuitries = circuitryServiceO.queryCirPageByNo(circuitry, page);

        //查询总数
        Integer count = circuitryServiceO.queryCirCountPageByNo(circuitry);
        page.setCount(count);

        if (circuitries.size() > 0){

            Msg msg = Msg.success();
            msg.add("countPage", page.getCountPage());
            msg.add("circuitries", circuitries);

            return msg;
        }else {
            return Msg.fail().add("error", "线路信息查询失败");
        }
    }
}
